/*
 * TacticaDemo01.java
 *
 * Created on 16 de julio de 2006, 13:20
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.millos;

import futbol.tacticas.*;
import futbol.General;
import futbol.Partido;
import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

import futbol.tacticas.concursantes.Tactica;
import futbol.tacticas.concursantes.SistemVacio;

/**
 *
 * @author Administrador
 */
public class TacticaPrueba02 implements Tactica{
    
    private int nValores[][]={
        {-152,0,5},
        {-100,100,6},
        {-120,30,6},
        {-120,-30,6},        
        {-100,-100,6},
        {20,100,6},
        {-20,30,6},
        {-20,-30,6},
        {20,-100,6},
        {120,30,6},
        {100,-60,6}  //El nueve se corregir en el framework y dejar como 7 mximo
    };
   
    Point posicionBola = null;  //Modificado por Jorge Rubira. He quitado el static para que se inicialice cada vez que se inicia un partido.
    double velocidadBola = 0;  //Modificado por Jorge Rubira. He quitado el static para que se inicialice cada vez que se inicia un partido.
    public String getNombre(){
        return "Millos";
    }
    
    public Color getColor1(){
        return Color.yellow;
    }
    
    public Color getColor2(){
        return new Color(30,140,255);
    }
    
    public Color getColorNumero(){
        return Color.black;
    }
    
    public int getFuerza(int n){
        return nValores[n][2];
    }
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj){
        Vector<Comando> comandos=new Vector();
        
        General gen= new General();
        int cont = 0;
        
        int despejado = 0;
        for (int n=0;n<11;n++)
            comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
        
        
          
        Point jug[]=sj.getMisJugadores();
        Point ene[]=sj.getContrario();
        Vector atacantes = new Vector();
         ///para cubrir a los atacantes, anticipandolos 
        for(int i=0;i<ene.length;i++){
          
          if(ene[i].getX() < -50){
//            atacantes.g = i;    
            atacantes.add(ene[i]);
          }
          cont++;
          if(i>3)
            break;
        }
        int excluir[] = new int[10];
        double anguloEntreContrarioBalon = 0;
        Point cercaAtacante = new Point();
        for(int i=1;i<5;i++){
          int masCercano = sj.getInfoMasCercano(ene, jug[i],excluir,false)[0];
          anguloEntreContrarioBalon = gen.getAngulo(ene[masCercano].getX(),ene[masCercano].getY(),sj.getBola().getX(),sj.getBola().getY());
          cercaAtacante.setLocation( ene[masCercano].getX()+10*(Math.cos(anguloEntreContrarioBalon)), ene[masCercano].getY()+10*(Math.sin(anguloEntreContrarioBalon)));
    
    if((gen.getDistancia(cercaAtacante.getX(), cercaAtacante.getY(), sj.getBola().getX(), sj.getBola().getY()) > 
                  gen.getDistancia(ene[masCercano].getX(), ene[masCercano].getY(), sj.getBola().getX(), sj.getBola().getY())) &&
                  (gen.getDistancia(ene[masCercano].getX(), ene[masCercano].getY(), sj.getBola().getX(), sj.getBola().getY()) > 20) )     
      SistemVacio.out.println("DB> contrario "+ene[masCercano].getX()+","+ene[masCercano].getY()+" jug situar en : "+cercaAtacante.getX()+","+cercaAtacante.getY()+
              " bola : "+sj.getBola().getX()+","+sj.getBola().getY()+" mi marca-bola  cos :"+Math.cos(anguloEntreContrarioBalon)+" sen : "+
              Math.sin(anguloEntreContrarioBalon) +" angulo dado : "+anguloEntreContrarioBalon);            
          comandos.add(new ComandoIrA(i, cercaAtacante.getX(), cercaAtacante.getY()));
          //  comandos.add(new ComandoIrA(i, ene[masCercano].getX()+10, ene[masCercano].getY()));
//System.out.println("DB>115  "+i+" va a cubrir a "+masCercano);
          for(int k=0;k<excluir.length;k++)
        //      System.out.println("DB>115 excluido "+excluir[k]);
           excluir[i-1] = masCercano;
             
        }
        
        
        for(int i=5;i<11;i++){
          int masCercano = sj.getInfoMasCercano(ene, jug[i],excluir,false)[0];
          anguloEntreContrarioBalon = gen.getAngulo(ene[masCercano].getX(),ene[masCercano].getY(),sj.getBola().getX(),sj.getBola().getY());
          cercaAtacante.setLocation( ene[masCercano].getX()+10*(Math.cos(anguloEntreContrarioBalon)), ene[masCercano].getY()+10*(Math.sin(anguloEntreContrarioBalon)));
           if((gen.getDistancia(cercaAtacante.getX(), cercaAtacante.getY(), sj.getBola().getX(), sj.getBola().getY()) > 
                  gen.getDistancia(ene[masCercano].getX(), ene[masCercano].getY(), sj.getBola().getX(), sj.getBola().getY())) &&
                  (gen.getDistancia(ene[masCercano].getX(), ene[masCercano].getY(), sj.getBola().getX(), sj.getBola().getY()) > 20) )     
      SistemVacio.out.println("DB> contrario "+ene[masCercano].getX()+","+ene[masCercano].getY()+" jug situar en : "+cercaAtacante.getX()+","+cercaAtacante.getY()+
              " bola : "+sj.getBola().getX()+","+sj.getBola().getY()+" mi marca-bola  cos :"+Math.cos(anguloEntreContrarioBalon)+" sen : "+
              Math.sin(anguloEntreContrarioBalon) +" angulo dado : "+anguloEntreContrarioBalon);        
          comandos.add(new ComandoIrA(i, cercaAtacante.getX(), cercaAtacante.getY()));
//System.out.println("DB>115  "+i+" va a cubrir a "+masCercano);
            for(int k=0;k<excluir.length;k++)
        //      System.out.println("DB>115 excluido "+excluir[k]);
            excluir[i-1] = masCercano;
             
        }
        int nJug=sj.getMasCercanoDeBola();
        Point bola=sj.getBola();
        Point posicionBolaAntes = null;
        double velocidadNormalizada = 0;
if(posicionBola != null){
  SistemVacio.out.println("DB>bola direccion  :"+gen.getAngulo(posicionBola.getX(), posicionBola.getY(), bola.getX(), bola.getY())+" velocidad : "+(gen.getDistancia(posicionBola.getX(), posicionBola.getY(), bola.getX(), bola.getY()))/100 );    
  
  double velocidadActual = (gen.getDistancia(posicionBola.getX(), posicionBola.getY(), bola.getX(), bola.getY()))/100 ;
  velocidadNormalizada = velocidadActual/1.6324827717314507;

  if(velocidadActual > velocidadBola)
    velocidadBola = velocidadActual;
  
 SistemVacio.out.println(" velocidad actual normalizada : "+velocidadNormalizada); 
  if(bola.getX() == 0 && bola.getY() == 0 ){
    if(posicionBola.getX() < 0 )
      SistemVacio.out.println("GO0000OL CONTRARIO");
    else 
      SistemVacio.out.println("GO0000OL MIO");
  }
  posicionBolaAntes = (Point)posicionBola.clone();
}
        posicionBola =  sj.getBola();
        

        comandos.add(new ComandoIrA(nJug, bola.getX() , bola.getY()));
        
        /*
        int jugadorMenosMarcado = 0;
        for (int n=0;n<11;n++)
            comandos.add(new ComandoTiroAPuerta(n,0));
        */
        
        Point contrario = ene[sj.getContrarioMasCerca(0)];
        double distancia = gen.getDistancia(jug[0].getX(), jug[0].getY(), contrario.getX(), contrario.getY());
        
        double distanciaArqueroBola = gen.getDistancia(jug[0].getX(), jug[0].getY(), bola.getX(), bola.getY());
        
        Point contrarioMasCercaBalon = ene[sj.getContrarioMasCerca(bola.getX(), bola.getY())];
        double anguloDisparoContrario = gen.getAngulo(contrarioMasCercaBalon.getX(), contrarioMasCercaBalon.getY(), bola.getX(), bola.getY());
        double anguloDireccionBola = 0;
        double arqueroEsperaBola = 0;
        if(posicionBola != null && posicionBolaAntes != null){
          anguloDireccionBola = gen.getAngulo(posicionBolaAntes.getX(), posicionBolaAntes.getY(), posicionBola.getX(), posicionBola.getY());
          arqueroEsperaBola = bola.getY()+(Math.sin(anguloDireccionBola)*distanciaArqueroBola);
        }
        if (arqueroEsperaBola < 30 && arqueroEsperaBola > -30){
          if(bola.getX() > -130)
            comandos.add(new ComandoIrA(0, nValores[0][0], arqueroEsperaBola));
          else{
            if(velocidadNormalizada < 0.5)
             comandos.add(new ComandoIrA(0, bola.getX(), bola.getY()));
            else 
             comandos.add(new ComandoIrA(0, 0,arqueroEsperaBola)); 
            
          }
        } else if( sj.getMiJugadorMasCerca(bola.getX(), bola.getY()) == 0 && gen.getDistancia(jug[0].getX(), jug[0].getY(), bola.getX(), bola.getY()) <
                gen.getDistancia(ene[sj.getContrarioMasCerca(bola.getX(), bola.getY())].getX(), ene[sj.getContrarioMasCerca(bola.getX(), bola.getY())].getY() , 
                bola.getX(), bola.getY())  ){
            comandos.add(new ComandoIrA(0, bola.getX(), bola.getY()));
        } else {
          if(arqueroEsperaBola > 0)
            comandos.add(new ComandoIrA(0, nValores[0][0], 20));
          else 
            comandos.add(new ComandoIrA(0, nValores[0][0], -20));
        } 
    
SistemVacio.out.println(" distancia en x Arquero-bola : "+(bola.getX()-jug[0].getX()));         
        
        if(gen.getDistancia(jug[0].getX(), jug[0].getY(), bola.getX(), bola.getY()) < 10){
           pintarSituacionTablero(jug,ene,bola);
           despejado = jugadorDespejadoDelante(jug,  ene, 0);
        }
          
         // comandos.add(new ComandoGolpearBola(0, contrario.getX(), contrario.getY()*(-1)));
        //  comandos.add(new ComandoGolpearBola(0, contrario.getX(), contrario.getY()*(-1)));
          if(despejado != 0)
            comandos.add(new ComandoGolpearBola(0, jug[despejado].getX(), jug[despejado].getY()));
          else {
            if(ene[sj.getContrarioMasCerca(0)].getY() < 0)
              comandos.add(new ComandoGolpearBola(0, jug[0].getX()+10, 120));
            else 
              comandos.add(new ComandoGolpearBola(0, jug[0].getX()+10, -120));
          }

      /*
        if(sj.getMiJugadorMasCerca(bola.getX(), bola.getY()) == 0){
          this.lanzarBolaMejor(sj, comandos);
        }
        */
        for (int n=1;n<11;n++)
            comandos.add(new ComandoTiroAPuerta(n,0));
        
        return comandos;
    }
    private int jugadorDespejadoDelante(Point[] jug, Point[] ene, int n){
      int delante[] = new int[10];
      int noCubiertos[] = new int[10]; 
      int mejorPase = 0;
      double combinacion = 0;
      double combinacionMejor = 0;
      double distanciaContrario = 0;
      double puntajeAngulo = 0;
      double puntajeDistancia = 0;
      double distanciaCompaero = 0;
      double angulo = 0;
      double angulo2 = 0;
      double cubierto = 0;
      double distanciaEntreCompaeroYContrario = 0;
      General gen= new General();
      int cont = 0;
      boolean interrumpe = true;
      for(int i=1;i < 11;i++){
        if(jug[i].getX() > jug[n].getX()){
          delante[cont] = i;
          cont++;
        }
      }
      cont = 0;
   //   System.out.println("jugadores delante :"+delante[0]+","+delante[1]+","+delante[2]+","+delante[3]+","+delante[4]+","+delante[5]+","+delante[6]+","+delante[7]+","+delante[8]+","+delante[9]);
       for(int i=0;i < delante.length ;i++){
        angulo = gen.getAngulo(jug[n].getX(),jug[n].getY(), jug[delante[i]].getX(), jug[delante[i]].getY());
    
        if(angulo > (3*(Math.PI*0.5)))
          angulo = angulo-(2*Math.PI);
        cubierto = 0;
        int j = 0;
        distanciaCompaero = gen.getDistancia(jug[n].getX(),jug[n].getY(), jug[delante[i]].getX(), jug[delante[i]].getY());
// System.out.println("angulo mi compaero  :"+angulo+" distancia compaero : "+distanciaCompaero);        
        for(j=0;j < ene.length; j++){
          angulo2 = gen.getAngulo(jug[n].getX(),jug[n].getY(), ene[j].getX(), ene[j].getY());
     
          if(angulo2 > (3*(Math.PI*0.5)))
             angulo2 = angulo2-(2*Math.PI);
          cubierto = Math.abs(angulo2-angulo);
          distanciaContrario = gen.getDistancia(jug[n].getX(),jug[n].getY(), ene[j].getX(), ene[j].getY());
          distanciaEntreCompaeroYContrario = gen.getDistancia(jug[delante[i]].getX(), jug[delante[i]].getY(), ene[j].getX(), ene[j].getY());
//System.out.println(" angulo contrario : "+angulo2+" distancia Contrario : "+distanciaContrario); 
SistemVacio.out.println(" jug : "+delante[i]+" ene : "+j+" cubierto : "+cubierto+" angulo jug : "+angulo+" angulo ene : "+angulo2+" distancia "+(distanciaContrario-distanciaCompaero));       
          if(distanciaContrario < distanciaCompaero && ( cubierto < Math.PI/8 || distanciaEntreCompaeroYContrario < 30) ) {
            break;
          } else {
             
          }
          
          
        }
SistemVacio.out.println("j = "+j);    
        if (j == ene.length){
      
          noCubiertos[cont] = delante[i];
          cont++;
          /*
            System.out.println("caso que sirve ");   
            System.out.println("angulo mi compaero  :"+angulo+" distancia compaero : "+distanciaCompaero);      
            System.out.println(" angulo contrario : "+angulo2+" distancia Contrario : "+distanciaContrario);   
           */
          
         
        }
        
      }

 SistemVacio.out.println("DB>no cubiertos : "+noCubiertos[0]+","+noCubiertos[1]+","+noCubiertos[2]+","+noCubiertos[3]+","+noCubiertos[4]+","+noCubiertos[5]+","+noCubiertos[6]+",");               
      double anguloCompaero = 0;
      double anguloDiferencia = 0;
      double anguloArco = gen.getAngulo(jug[n].getX(), jug[n].getY(), 190, 0);
      
       if(anguloArco > (3*(Math.PI*0.5)))
             anguloArco = anguloArco-(2*Math.PI);
      double anguloMejor = 7;
      
      for(int i=0;i<noCubiertos.length;i++){
        anguloCompaero = gen.getAngulo(jug[n].getX(), jug[n].getY(), jug[noCubiertos[i]].getX(), jug[noCubiertos[i]].getX());
  
        if(anguloCompaero > (3*(Math.PI/2)))
             anguloCompaero = anguloCompaero-(2*Math.PI);
        anguloDiferencia = Math.abs(anguloCompaero-anguloArco);
SistemVacio.out.println("jug : "+noCubiertos[i]+" angulo arco : "+anguloArco+" angulo diferencia : "+anguloDiferencia);

        if(anguloDiferencia < anguloMejor){
          anguloMejor = anguloDiferencia;
          mejorPase = noCubiertos[i];    
        }
      }
 SistemVacio.out.println("DB>mejor pase : "+mejorPase);                
      return mejorPase;
    }
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>50)
                com.add(new ComandoTiroAPuerta(n,15));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
    private void pintarSituacionTablero(Point[] jug, Point[] ene, Point bola){
      int ancho = 40;
      int largo = 60;
      int xBola = new Double((bola.getX()+160)/6).intValue();
      int yBola = new Double((bola.getY()+120)/6).intValue();
      int xJugador = 0;
      int yJugador = 0;
      
      String[][] campo = new String[largo][ancho]; 
      String strCampo = "";
   
      for(int i=0;i<ancho;i++){
      for(int j=0;j<largo;j++){
        /*
        if(i==0 || i==24)
         campo[i][j]= "-";
        else if(j==0 || j==36)
         campo[i][j]= "|";
        else
         */ 
        if(j == xBola && i == yBola)
           campo[j][i]= "o";
        else if(j== largo -1)
          campo[j][i]= "\n";
        else if( (j == 0 || j == largo-2) && ( i == ((ancho/2)-(ancho/8)) || i == ((ancho/2)+(ancho/8))))
          campo[j][i]= "-";
        else if( (j == 0 || j == largo-2) && ( i < ((ancho/2)-(ancho/8)) || i > ((ancho/2)+(ancho/8))))
          campo[j][i]= "|";
        else if(i == 0 || i == ancho-1 )
          campo[j][i]= "-";
        else
          campo[j][i]= " ";
        for(int k=0;k<jug.length;k++){
          xJugador =  new Double(jug[k].getX()).intValue();
          yJugador = new Double(jug[k].getY()).intValue();
          xJugador = (xJugador+160)/6;
          yJugador = (yJugador+120)/6;
          if(j ==  xJugador && i == yJugador)
            campo[j][i]= new Integer(k).toString();
        }
        for(int k=0;k<ene.length;k++){
          xJugador =  new Double(ene[k].getX()).intValue();
          yJugador = new Double(ene[k].getY()).intValue();
          xJugador = (xJugador+160)/6;
          yJugador = (yJugador+120)/6;
          if(j ==  xJugador && i == yJugador)
            campo[j][i]= "-"+new Integer(k).toString();;
        }
      }
       
     }
     strCampo = " ";
     for(int i=0;i<ancho;i++){
      for(int j=0;j<largo;j++){
         strCampo+=campo[j][i]+" ";
      }
       
     }
    SistemVacio.out.println("SITUACION CAMPO\n");  
    SistemVacio.out.println(strCampo);  
    }
    
}
